#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_socket = new QTcpSocket(this);
    m_nextMsgSize = 0;
    connect(m_socket, &QTcpSocket::readyRead, this, &MainWindow::slotReadyRead);
    connect(m_socket, &QTcpSocket::disconnectFromHost, m_socket, &QTcpSocket::deleteLater);
    connect(m_socket, &QTcpSocket::disconnected, this, &MainWindow::slot)
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::slotReadyRead()
{    
    QDataStream in(m_socket);
    in.setVersion(QDataStream::Qt_5_12);
    qDebug() << "MainWindow::slotReadyRead()" << m_socket << "in.status()" << in.status();
    if(in.status() == QDataStream::Ok){
        // Точно не известно придут данные по частям или целиком
        //
        for(;;){
            // чтение размера блока сообщения
            if(m_nextMsgSize == 0){
                // для чтения доступно не меньше 2 байт
                if(m_socket->bytesAvailable() < 2){
                    break;
                }
                in >> m_nextMsgSize;
                qDebug() << "m_nextMsgSize = " << m_nextMsgSize;
            }
            if(m_socket->bytesAvailable() < m_nextMsgSize){
                break;
            }
            QString str;
            in >> str;
            ui->textEdit->insertPlainText(str);
            m_nextMsgSize = 0;      // для считывания нового сообщения
            qDebug() << "str" << str << "m_nextMsgSize" << m_nextMsgSize;
        }

    } else {
        ui->textEdit->insertPlainText("read error");
    }
}




void MainWindow::on_pushButton_clicked()
{
    if(ui->pushButton->text() == "Connect"){
        ui->pushButton->setText("Disconnect");
        m_socket->connectToHost("127.0.0.1", 2323);
    } else {
        ui->pushButton->setText("Connect");
        ui->textEdit->append("disconnect");
        m_socket->disconnectFromHost();
    }


    qDebug() << "MainWindow::on_pushButton_clicked() m_socket" << m_socket;

}

void MainWindow::sendToServer(QString msg)
{
    m_data.clear();
    QDataStream out(&m_data, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_12);
    // запись сообщения в формате "размер передаваемого  сообщения" (2 байта)
    // и "сообщение" для передачи на сервер (все остальные байты)
    out << quint16(0) << msg;
    qDebug() << "Client::sendToServer() m_data.size()" << m_data.size();
    out.device()->seek(0); // переходим в начала сообщения для записи его реального размера
    out << quint16(m_data.size() - sizeof(quint16)); // записать в первые два байта сообщения
    // реальный размер сообщения m_data.size(), вычесть первые два байта с размером сообщения

    qDebug() << "Client::sendToServer() m_data.size()" << m_data.size() << msg;
    m_socket->write(m_data);
    ui->lineEdit->clear();

}

void MainWindow::on_pushButton_2_clicked()
{
    sendToServer(ui->lineEdit->text());
}



void MainWindow::on_lineEdit_returnPressed()
{
    sendToServer(ui->lineEdit->text());
}

